www.gusucode.com > VC++ 百叶窗面板组特效源码-源码程序 > VC++ 百叶窗面板组特效源码-源码程序/code/CurtainBoxDlg.cpp
//Download by http://www.NewXing.com // CurtainBoxDlg.cpp : implementation file // #include "stdafx.h" #include "CurtainBox.h" #include "CurtainBoxDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCurtainBoxDlg dialog CCurtainBoxDlg::CCurtainBoxDlg(CWnd* pParent /*=NULL*/) : CDialog(CCurtainBoxDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCurtainBoxDlg) m_Edit = _T("作者:风林"); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CCurtainBoxDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCurtainBoxDlg) DDX_Control(pDX, IDC_TITLE3, m_Title3); DDX_Control(pDX, IDC_TITLE2, m_Title2); DDX_Control(pDX, IDC_TITLE1, m_Title1); DDX_Text(pDX, IDC_CONTROL32, m_Edit); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCurtainBoxDlg, CDialog) //{{AFX_MSG_MAP(CCurtainBoxDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_TITLE1, OnTitle1) ON_BN_CLICKED(IDC_TITLE2, OnTitle2) ON_BN_CLICKED(IDC_TITLE3, OnTitle3) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCurtainBoxDlg message handlers BOOL CCurtainBoxDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here InitBox(); //初始化面板组 return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CCurtainBoxDlg::OnPaint() { CPaintDC dc(this); // device context for painting if (IsIconic()) { SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } CRect rect; GetClientRect(&rect); dc.FillSolidRect(&rect,RGB(192,248,202)); //绘制对话框背景色 CBrush Brush; //画边框 Brush.CreateSolidBrush( RGB(97,120,140) ); dc.SelectObject( &Brush ); dc.RoundRect( m_BoxRext.left-9, m_BoxRext.top-9, m_BoxRext.right+9, m_BoxRext.bottom+9, 10, 10 ); //外框 dc.FillSolidRect( m_BoxRext.left, m_BoxRext.top, m_BoxRext.Width(), m_BoxRext.Height(), GetSysColor( COLOR_BTNFACE ) ); //内框 } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CCurtainBoxDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } ///////////////////////////////////////////////////////////////////// //初始化面板组 void CCurtainBoxDlg::InitBox() { m_BoxRext.SetRect( 44, 29, 232, 247); //面板组位置 m_Box1ID[0] = IDC_CONTROL11; //面板1中控件ID号 m_Box1ID[1] = IDC_CONTROL12; m_Box1ID[2] = IDC_CONTROL13; m_Box1ID[3] = IDC_CONTROL14; m_Box2ID[0] = IDC_CONTROL21; //面板2中控件ID号 m_Box3ID[0] = IDC_CONTROL31; //面板3中控件ID号 m_Box3ID[1] = IDC_CONTROL32; m_Box3ID[2] = IDC_CONTROL33; b_Mark1 = true; //面板1初态-展开 b_Mark2 = true; //面板2初态-展开 b_Mark3 = false; //面板3初态-收缩 m_Title3.SetButStatus(BUT_STATUS_RIGHT); ShowBox3( SW_HIDE ); //隐藏面板3中控件 CRect rect; CWnd *pWnd = GetDlgItem( IDC_TITLE1 ); pWnd->GetWindowRect( &rect ); //求标题条尺寸 m_TitleHeight = rect.Height(); //标题条高度 m_BoxHeight[0] = m_TitleHeight+60; //面板1的高度(包括标题条) m_BoxHeight[1] = m_TitleHeight+88; //面板2的高度(包括标题条) m_BoxHeight[2] = m_TitleHeight+40; //面板3的高度(此值在增加面板时才有用) CalculateControlPos1(); //显示面板组 SetBox1Pos(); CalculateControlPos2(); SetBox2Pos(); CalculateControlPos3(); SetBox3Pos(); } //刷新面板组 void CCurtainBoxDlg::InvalidateBox() { CalculateControlPos1(); SetBox1Pos(); CalculateControlPos2(); SetBox2Pos(); CalculateControlPos3(); SetBox3Pos(); InvalidateRect( &m_BoxRext ); } //////////////////////////////////////////////////////////////////////////// //面板1 //计算各控件位置 void CCurtainBoxDlg::CalculateControlPos1() { m_TitlePt[0].x = m_BoxRext.left; //标题条位置(左上角坐标) m_TitlePt[0].y = m_BoxRext.top; m_ControlPt1[0] = CPoint( m_TitlePt[0].x+5, m_TitlePt[0].y+m_TitleHeight+10 );//控件位置(相对于标题条) m_ControlPt1[1] = CPoint( m_TitlePt[0].x+31, m_TitlePt[0].y+m_TitleHeight+7 ); m_ControlPt1[2] = CPoint( m_TitlePt[0].x+7, m_TitlePt[0].y+m_TitleHeight+38 ); m_ControlPt1[3] = CPoint( m_TitlePt[0].x+75, m_TitlePt[0].y+m_TitleHeight+38 ); } //设置各控件位置 void CCurtainBoxDlg::SetBox1Pos() { CWnd *pWnd = GetDlgItem( IDC_TITLE1 ); pWnd->SetWindowPos( NULL, m_TitlePt[0].x, m_TitlePt[0].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整标题栏位置 int i; for( i=0; i<BOX1_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box1ID[i] ); pWnd->SetWindowPos( NULL, m_ControlPt1[i].x, m_ControlPt1[i].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整控件位置 } } //显示/隐藏面板(SW_SHOW-显示、SW_HIDE-隐藏) void CCurtainBoxDlg::ShowBox1(int nShow) { CWnd *pWnd; for( int i=0; i<BOX1_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box1ID[i] ); pWnd->ShowWindow( nShow ); } } //////////////////////////////////////////////////////////////////////////// //面板2 //计算各控件位置 void CCurtainBoxDlg::CalculateControlPos2() { m_TitlePt[1].x = m_BoxRext.left; //标题条位置(左上角坐标) if( b_Mark1 ) //面板1是展开的 m_TitlePt[1].y = m_TitlePt[0].y+m_BoxHeight[0]; else //面板1是收起的 m_TitlePt[1].y = m_TitlePt[0].y+m_TitleHeight; m_ControlPt2[0] = CPoint( m_TitlePt[1].x+5, m_TitlePt[1].y+m_TitleHeight+7 ); //控件位置 } //设置各控件位置 void CCurtainBoxDlg::SetBox2Pos() { CWnd *pWnd = GetDlgItem( IDC_TITLE2 ); pWnd->SetWindowPos( NULL, m_TitlePt[1].x, m_TitlePt[1].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整标题栏位置 int i; for( i=0; i<BOX2_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box2ID[i] ); pWnd->SetWindowPos( NULL, m_ControlPt2[i].x, m_ControlPt2[i].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整控件位置 } } //显示/隐藏面板 void CCurtainBoxDlg::ShowBox2(int nShow) { CWnd *pWnd; for( int i=0; i<BOX2_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box2ID[i] ); pWnd->ShowWindow( nShow ); } } //////////////////////////////////////////////////////////////////////////// //面板3 //计算各控件位置 void CCurtainBoxDlg::CalculateControlPos3() { m_TitlePt[2].x = m_BoxRext.left; //标题条位置(左上角坐标) if( b_Mark2 ) //面板2是展开的 m_TitlePt[2].y = m_TitlePt[1].y+m_BoxHeight[1]; else //面板2是收起的 m_TitlePt[2].y = m_TitlePt[1].y+m_TitleHeight; m_ControlPt3[0] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+7 ); //控件位置 m_ControlPt3[1] = CPoint( m_TitlePt[2].x+85, m_TitlePt[2].y+m_TitleHeight+7 ); m_ControlPt3[2] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+35 ); } //设置各控件位置 void CCurtainBoxDlg::SetBox3Pos() { CWnd *pWnd = GetDlgItem( IDC_TITLE3 ); pWnd->SetWindowPos( NULL, m_TitlePt[2].x, m_TitlePt[2].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整标题栏位置 int i; for( i=0; i<BOX3_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box3ID[i] ); pWnd->SetWindowPos( NULL, m_ControlPt3[i].x, m_ControlPt3[i].y, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //调整控件位置 } } //显示/隐藏面板 void CCurtainBoxDlg::ShowBox3(int nShow) { CWnd *pWnd; for( int i=0; i<BOX3_NUMBER; i++ ) { pWnd = GetDlgItem( m_Box3ID[i] ); pWnd->ShowWindow( nShow ); } } ////////////////////////////////////////////////////////////////////////////////// //单击标题响应函数 //单击面板1标题(由ClassWizard添加) void CCurtainBoxDlg::OnTitle1() { if( m_Title1.ClickBut() ) //单击有效区 { b_Mark1 = !b_Mark1; //修改状态 if( b_Mark1 && b_Mark2 && b_Mark3 ) //保证最多同时展开两个面板 { b_Mark3 = false; m_Title3.SetButStatus(BUT_STATUS_RIGHT); ShowBox3( SW_HIDE); } if( b_Mark1 ) //展开/隐藏面板1 ShowBox1( SW_SHOW ); else ShowBox1( SW_HIDE ); InvalidateBox(); //刷新面板组 } } //单击面板2标题(由ClassWizard添加) void CCurtainBoxDlg::OnTitle2() { if( m_Title2.ClickBut() ) { b_Mark2 = !b_Mark2; if( b_Mark1 && b_Mark2 && b_Mark3 ) { b_Mark3 = false; m_Title3.SetButStatus(BUT_STATUS_RIGHT); ShowBox3( SW_HIDE); } if( b_Mark2 ) ShowBox2( SW_SHOW ); else ShowBox2( SW_HIDE ); InvalidateBox(); //刷新面板组 } } //单击面板3标题(由ClassWizard添加) void CCurtainBoxDlg::OnTitle3() { if( m_Title3.ClickBut() ) { b_Mark3 = !b_Mark3; if( b_Mark1 && b_Mark2 && b_Mark3 ) { b_Mark1 = false; m_Title1.SetButStatus(BUT_STATUS_RIGHT); ShowBox1( SW_HIDE); } if( b_Mark3 ) ShowBox3( SW_SHOW ); else ShowBox3( SW_HIDE ); InvalidateBox(); //刷新面板组 } }